#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

#define MAX_CHARS 256

void esperar (int senhal);
void controlador (int senhal);

int main (int argc, char *argv[]) {
  FILE *fp;
  int pid_hijo, cont;
  char linea[MAX_CHARS], numLinea[2];

  if (argc < 5) {
    printf("Uso: ./exec/manager -f archivo -p patron\n");
    exit(1);
  }

  // Apertura del archivo.
  if ((fp = fopen(argv[2], "r")) == NULL) {
    fprintf(stderr, "Error de apertura del archivo %s\n", argv[2]);
    exit(1);
  }

  cont = 1;

  while (fgets(linea, sizeof(linea), fp) != NULL) {
    sprintf(numLinea, "%d", cont);
    // Procesador.
    switch (pid_hijo = fork()) {
    case 0:
      execl("./exec/procesador", "procesador", numLinea, linea, argv[4], NULL);
      break;
    }
    // Contador.
    switch (pid_hijo = fork()) {
    case 0:
      execl("./exec/contador", "contador", numLinea, linea, NULL);
      break;
    }
    cont++;
  }

  fclose(fp);

  // Se espera la terminación de los procesos...
  if (signal(SIGCHLD, esperar) == SIG_ERR) {
    fprintf(stderr, "No se esperó a un proceso.\n");
    exit(1);
  }

  // Manejo de Ctrol+C.
  if (signal(SIGINT, controlador) == SIG_ERR) {
    fprintf(stderr, "Terminación incorrecta.\n");
    exit(1);
  }

  while(1) // Bucle infinito de espera.
    pause(); // A la espera de Ctrl+C.
  
  return 0;
}

void esperar (int senhal) {
  int i;
  while (wait3(&i, WNOHANG, NULL) > 0);
}

void controlador (int senhal) {
  printf("\nCtrl+c capturada.\n");
  printf("Finalizando...\n\n");
  
  // Liberación de recursos...

  sleep(1);
  printf("OK!\n");
  // Salida del programa.
  exit(0);
}
